import axios from 'axios'
import store from '../store'
// import { getToken } from './auth'

const request = axios.create({
  baseURL: 'http://127.0.0.1:7001',
  timeout: 20000
})

// 正在进行中的请求列表
const reqList = []

/**
 * 阻止重复请求
 * @param {Array} reqList - 请求缓存列表
 * @param {String} url - 当前请求地址
 * @param {Function} cancel - 请求中断函数
 * @param {String} errorMessage - 请求中断时需要展示的错误信息
 */
const stopRepeatRequest = function (reqList, url, cancel, errorMessage) {
  const errorMsg = errorMessage || ''
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      cancel(errorMsg)
      return
    }
  }
  reqList.push(url)
}

/**
 * 允许某个请求可以继续进行
 * @param {Array} reqList 全部请求列表
 * @param {String} url 请求地址
 */
// 允许某个请求继续进行
const allowRequest = function (reqList, url) {
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      // TODO: array.splice(index,howmany,item1,.....,itemX)
      // index 必需。规定从何处添加/删除元素。
      // howmany 可选。规定应该删除多少元素。必须是数字，但可以是 "0"。如果未规定此参数，则删除从 index 开始到原数组结尾的所有元素。
      // item1, ..., itemX 可选。要添加到数组的新元素
      reqList.splice(i, 1)
      break
    }
  }
}

// 请求拦截器
request.interceptors.request.use(config => {
  let cancel
  // 设置 cancelToken 对象
  config.cancelToken = new axios.CancelToken(c => {
    cancel = c
  })
  stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)
  if (store.getters.GET_TOKEN) {
    // 如果用户已经登录 则统一给请求设置token信息
    // config.headers.Authorization = `Bearer ${store.getters.GET_TOKEN}`
    config.headers.Authorization = `${store.getters.GET_TOKEN}`
  }
  // console.log('请求拦截器 config', config)
  return config
}, error => {
  Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(response => {
  allowRequest(reqList, response.config.url)
  return response
}, error => {
  if (axios.isCancel(error)) {
    console.log(error.message)
  } else {
    allowRequest(reqList, error.config.url)
  }
  Promise.reject(error)
})

export default request
